//
//  CZStatusViewModel.swift
//  微博08
//
//  Created by apple on 16/3/1.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import SDWebImage

// 专门处理CZStatus的数据
class CZStatusViewModel: NSObject {
    
    /// 加载微博数据的标志位
    private var loadingStatus = false

    /**
     ViewModel加载微博数据
     
     - parameter since_id: 若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
     - parameter max_id:   若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
     - parameter finished: 完成时的闭包
     */
    func loadStatus(since_id: Int, max_id: Int, loadStatusCallBack: (statuses: [CZStatus]?, error: NSError?) -> ()) {
        if loadingStatus {
            // 正在加载微博, 返回,不去请求网络数据
            let error = CZNetworkToolError.StatusLoading.error()
            loadStatusCallBack(statuses: nil, error: error)
            return
        }
        
        // 没有加载微博,会走这里
        loadingStatus = true
        
        // 3.调用DAL加载微博数据,有可能从数据,也有可能从网络
        CZStatusDAL.sharedDAL.loadStatus(since_id, max_id: max_id) { (statuses, error) -> () in
            self.loadingStatus = false
            
            // 11.判断错误
            if error != nil {
                loadStatusCallBack(statuses: nil, error: error)
                return
            }
            
            // 12.获取返回数据中的微博数据
            
            // 定义空数组保存模型数据
            var statusesModel = [CZStatus]()
            
            // 13.遍历数组字典转模型
            for dict in statuses! {
                let status = CZStatus(dict: dict)
                statusesModel.append(status)
            }
            
            // 在通知控制器之前下载图片
            self.loadWebImage(statusesModel, loadStatusCallBack: loadStatusCallBack)
        }
//        // 3.调用网络工具类的方法加载数据,准备闭包,尾随闭包没有参数时,可以省略()
//        CZNetworkTool.sharedInstance.loadStatus(since_id, max_id: max_id) { (result, error) -> () in
//            self.loadingStatus = false
//            // 11.判断错误
//            if error != nil {
//                loadStatusCallBack(statuses: nil, error: error)
//                return
//            }
//            
//            // 12.获取返回数据中的微博数据
//            if let array = result?["statuses"] as? [[String: AnyObject]] {
//                
//                // TODO: 测试保存微博数据
////                    CZStatusDAL.sharedDAL.saveStatus(array)
//                
//                // 定义空数组保存模型数据
//                var statuses = [CZStatus]()
//                
//                // 13.遍历数组字典转模型
//                for dict in array {
//                    let status = CZStatus(dict: dict)
//                    
//                    statuses.append(status)
//                }
//                
//                // 在通知控制器之前下载图片
//                self.loadWebImage(statuses, loadStatusCallBack: loadStatusCallBack)
//                
//                // 14.调用闭包通知控制器
//                //                loadStatusCallBack(statuses: statuses, error: nil)
//            } else {
//                loadStatusCallBack(statuses: nil, error: nil)
//            }
//        }
    }
    
    /**
     在控制器显示之前下载图片
     
     - parameter statuses: 要下载图片的微博数据
     */
    func loadWebImage(statuses: [CZStatus], loadStatusCallBack: (statuses: [CZStatus]?, error: NSError?) -> ()) {
        print("bundle: \(NSHomeDirectory())")
        
        let group = dispatch_group_create()
        
        var length = 0
        
        // 获取模型里面的图片地址来下载
        for status in statuses {
            // 要下载的图片
            var urls: [NSURL] = [NSURL]()
            
            // 查找原创微博要下载的图片
            if let downloadURL = status.storePictureURLs {
                urls = downloadURL
            }
            
            if let downloadURL = status.retweeted_status?.storePictureURLs {
                urls = downloadURL
            }
            
            // 其实只需要缓存带一张图片的微博的这个图片
            if urls.count == 1 {
                // 只下载有一张图片的
                let url = urls.first
                
//            for url in urls {
                // 进入组
                dispatch_group_enter(group)
                // 下载图片异步任务
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                    dispatch_group_leave(group)
                    
                    if error != nil {
                        print("下载出错: \(error)")
                        return
                    }

                    let data = UIImagePNGRepresentation(image)
                    length += data!.length
                })
            }
        }
        
        // 所有图片缓存完需要让控制器去显示数据
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("所有图片下载完成,通知控制器显示数据: 缓存图片大小: \(CGFloat(length) / 1024.0 / 1024.0) MB")
            loadStatusCallBack(statuses: statuses, error: nil)
        }
    }
    
    /**
    发布微博, 连续两次发布的微博不可以重复
    
    - parameter status:             微博内容
    - parameter sendStatusCallBack: 回调
    */
    class func sendStatus(status: String, image: UIImage?, sendStatusCallBack: (error: NSError?) -> ()) {
        
        // 判断token
        guard let access_token = CZUserAccountViewModel.sharedInstance.userAccount?.access_token else {
            let error = CZNetworkToolError.AccessTokenEmpty.error()
            sendStatusCallBack(error: error)
            return
        }
        
        // 参数
        let parameters = [
            "access_token": access_token,
            "status": status
        ]
        
        // 没有图片,发布普通纯文本微博
        if image == nil {
            // url
            let urlString = "https://api.weibo.com/2/statuses/update.json"
            
            // 发送请求
            CZNetworkTool.sharedInstance.afnManager.POST(urlString, parameters: parameters, progress: nil, success: { (_, result) -> Void in
                sendStatusCallBack(error: nil)
                }) { (_, error) -> Void in
                    sendStatusCallBack(error: error)
            }
        } else {
            // 有图片,发布带图片的微博
            // url
            let urlString = "https://upload.api.weibo.com/2/statuses/upload.json"
            
            CZNetworkTool.sharedInstance.afnManager.POST(urlString, parameters: parameters, constructingBodyWithBlock: { (formData) -> Void in
                // 将图片转成NSData
                let imageData = UIImagePNGRepresentation(image!)!
                
                // data: 要上传内容的2进制
                // name: 接口文档指定的上传字段名称
                // fileName: 保存在服务器的文件名称,看api文档,有规定有按规定来填,没有规定,随便填
                // mimeType: 类型: image/png. image/jpeg, image/gif
                formData.appendPartWithFileData(imageData, name: "pic", fileName: "hehe", mimeType: "image/png")
                }, progress: nil, success: { (_, result) -> Void in
                    sendStatusCallBack(error: nil)
                }) { (_, error) -> Void in
                    sendStatusCallBack(error: error)
            }
        }
    }
}
